/**
 * ./src/fonction_connection.h
 * Copyright (C) 2009 lameire alexis
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef FONCTION_CONNECTION_H
#define FONCTION_CONNECTION_H
#include "gestion_connection.h"
#include <stdbool.h>
#include <stdio.h>
struct mot_existe {
	FILE *fichier;
	bool existance;
	int debut_mot;
	char *mot;
};
typedef struct mot_existe mot_existe;
void kick(irc_session_t * session, const char **\params, const const char *origin, donnee_de_control * jeux, size_t taille_commande);
/**
 * \brief kick : prépare la demande de kick
 * \param session pointeur de séssion envoyer lors de l'appel a la callback
 * \param params paramétre envoyer lors de l'appel a la callback
 * \param origin originaire de l'appel a la callback
 * \param jeux pointeur sur les données néssésaires entre les différents événements
 * \param taille_commande taille de la commande appelante ex pour !kick mettre 5
 * \return aucune
 * \return ferme le programme en cas d'érreur
 */
int verifier_leader(donnee_de_control * jeux, const char *origin, irc_session_t * session, unsigned char flag);
#define NEED_LEADER 1
#define SAVE_TO_LEADER 2
#define NEED_ADMIN 4
/**
 * \brief verifier_leader : verifie que la commande est exécuter par le leader
 * \param jeux pointeur sur les données de control
 * \param origin onriginaire de l'appel envoyer par le callback
 * \param flag modifie le comportement de la commande
 * \param 	NEED_LEADER	rend la commande exécutable par un joueur leader
 * \param	SAVE_TO_LEADER	sauvegarde le joueur courrent comme joueur_leader
 * \param 	NEED_ADMIN	nessésite un administrateur
 * \return 1 en cas de succés
 * \return 0 en cas d'échec.
 */
mot_existe *verif_ajouter_et_retirer(irc_session_t * session, const char **\params, const const char *origin, donnee_de_control * jeux,
				     size_t taille_commande);
/**
 * \brief varif_ajouter_retirer : fait les vérification préliminaires a l'ajout et au retrait du mot
 * \param session pointeur de session envoyer par libircclient
 * \param params paramétres envoyer par la callbacks
 * \param origin originaire du message envoyer par le callbacks
 * \param jeux donnée de control du programme
 * \param taille_commande taille de la commande faisent l'appel a la fonction
 * \return renvois une structure contenant :
 * \return 	le descripteur de fichier
 * \return 	un booléen de vérification
 * \return 	le mot a écrire ou a supprimer
 */
void valider_pseudo(irc_session_t * session, donnee_de_control * jeux, const char *pseudo_a_valider);
/**
 *  \brief valider_pseudo : valide le mot et ajoute les points au pseudo
 *  \param session session renvoyer par libircclient
 *  \param jeux	données de control du bot
 *  \param pseudo_a_valider pseudo a valider
 *  \return <aucun>
 */
void free_mot_existe(mot_existe *);

void cmd_dit(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_definir_leader(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_ok(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_kickban(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_kick(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_ajouter(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_retirer(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_password(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_sha1sum(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_debut_inscription(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_inscription(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_passer(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_stop(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_score(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_debut_jeux(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_ajouter_cat(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_retirer_cat(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_changer_cat(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_score_total(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_hlme(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);
void cmd_aide(donnee_de_control * jeux, const char *origin, irc_session_t * session, const char **\params, size_t taille_cmd);

/**
 * \brief cmd_* : Ajoute la commande spécifiée au bot. 
 * (ADMIN) cmd_dit : Répète le texte.
 * (ADMIN) cmd_definir_leader : Passe le rôle de leader à un autre joueur.
 * (ADMIN) cmd_ok : Valide la participation du joueur.
 * (ADMIN) cmd_kick : Kick la personne concernée.
 * (ADMIN) cmd_kickban : Ban et kick la personne concernée.
 * (ADMIN) cmd_ajouter : Ajoute un mot à la BDD.
 * (ADMIN) cmd_retirer : Retire un mot de la BDD.
 * (ADMIN) cmd_password : Valide l'identité du leader, sinon kick l'originaire de la commande.
 * (ALL)   cmd_sha1sum : Calcule la somme de contrôle sha1 et la renvoie à l'utilisateur.
 * (ADMIN) cmd_debut_inscription : Active les inscriptions pour une nouvelle partie.
 * (JOUEUR)cmd_inscription : Ajoute l'originaire de la commande à la partie.
 * (ADMIN) cmd_passer : Passe le mot courant et en tire un autre.
 * (ADMIN) cmd_stop : Arrête la partie courante et affiche les scores.
 * (JOUEUR)cmd_score : Affiche les scores.
 * (ADMIN) cmd_debut_jeux : Lance le jeu.
 * (ADMIN) cmd_ajouter_cat : Ajoute une catégorie au bot.
 * (ADMIN) cmd_retirer_cat : Retirer une catégorie du bot ainsi que les mots associés.
 * (ADMIN) cmd_changer_cat : Change la catégorie courante pour celle en argument si celle-ci existe.
 * (JOUEUR)cmd_score_total : Liste les scores totaux.
 * (JOUEUR)cmd_hl_me : Configure le HL.
 * (ALL)   cmd_aide : fournis l'aide sur les commandes
 * 
 * \param jeux pointeur sur les données du bot
 * \param parmas paramétre renvoyé par la callback de libircclient
 * \param origin originaire de l'événement envoyé par libircclient
 * \param session structure de la connexion renvoyée par libircclient
 * \param taille_cmd taille de la commande  (utile pour récupérer les arguments)
 * \return aucune 
 * \return peut étre amené à fermer le programme en cas d'erreur
 */
#endif
